package com.mipssa;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;



public class Parser {

				
		Vector<String> archivoAsm;
		Vector<Linea> archivoAsmParseado;
		Map<String, Instruccion> instrucciones; 
		
		
		public Parser(Vector<String>arch, Map<String, Instruccion> instr )
		{
			archivoAsm = arch;
			archivoAsmParseado = new Vector<Linea>();
			instrucciones = instr;
		}
		
		
		public Vector<Linea> parsearArchivoAsm(){
		
			//Enumeration<String> e = archivoAsm.elements();
			int i = 0;
			//while(e.hasMoreElements()){
			for(i=0; i<archivoAsm.size();i++){
				
				Linea lineap = new Linea();
				Vector<String> parametros = new Vector<String>();
				String operacion = "";
				
				String linea = archivoAsm.elementAt(i);
				linea = linea.replaceAll("\t", " ");
				lineap.setNumero(i+1);
				
				/* si es comentario entonces operacion = # y parametros = vacio */
				if(linea.startsWith("#")){
					lineap.setOperacion("#");
					parametros.clear();
					lineap.setParametros(parametros);
				}
				linea = this.quitarEspaciosAdelante(linea);	
				if (linea.length() != 0 && !linea.startsWith("#") && Util.esUnaLetra(linea.charAt(0))){

				/* parsear operacion */	
				
				operacion = linea;
					
				try {
					//operacion = linea.split(" ")[0].trim();
				    
					operacion = linea.substring(0,linea.indexOf(" "));
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					//e1.printStackTrace();
				}
			
				try {
					lineap.setOperacion( instrucciones.get(operacion.toUpperCase()).getNombre());
					
					
					//System.out.println("Linea "+(i+1)+": "+"\""+linea+"\"");
					//System.out.println(" Operacion: "+lineap.getOperacion());
				} catch (Exception e) {
					if(operacion.contains(":"))
					{
						lineap.setOperacion(operacion);
					}
					else
					{						
						System.out.println("Linea "+(i+1)+": "+"\""+linea+"\""+" ERROR! la operacion \""+operacion+"\" no esta definida.");
						System.exit(0);
					}
				}
				
				
				
				/* parsear parametros */
				
				if (this.cantDePalabras(linea) > 1){
					linea = linea.substring(linea.indexOf(" "));
					if(linea.contains("#"))
					{
						linea = linea.substring(0,linea.indexOf("#"));
					}
					int cantParam = linea.split(",").length;
					int cont = 0;
					String param = "";
					for(cont=0;cont<cantParam;cont++)
					{
						param = linea.split(",")[cont];
						param = param.trim();
						parametros.addElement(param);
						//System.out.print(" Param "+(cont+1)+": "+parametros.elementAt(cont));
					}
					//System.out.print("\n");
					lineap.setParametros(parametros);
					
				}
				
				
				}
				
				
				
				archivoAsmParseado.addElement(lineap);
				
			}
			
			
			return this.archivoAsmParseado;
		
		}
		
		

		
		
		

		private int cantDePalabras(String linea)
		{
			int numPalabras = 0;
			numPalabras = linea.split(" ").length;
			return numPalabras;

		}
		
		private String quitarEspaciosAdelante(String linea)
		{
			String res = "";
			int i = 0;
			while(linea.startsWith(" "))
			{
				linea = linea.substring(1);
				i++;
				if(i>255) 
					return linea;
			}
			return linea;
		}

	}


	

